const PENDING = 'pending' // 等待状态 初始状态
const FULFILLED = 'fulfilled' // 成功状态
const REJECTED = 'rejected' // 失败状态

class MyPromise {

  status = PENDING // 初始状态

  $value = undefined // 成功之后的值
  $reason = undefined // 失败之后的值
  successCallback = [] // 成功回调函数
  failCallback = [] // 失败回调函数
  constructor(execoter) {
    execoter(this.resolve, this.reject)
  }

  resolve = value => { 
    if(this.status !== PENDING) {return} // 如果状态不是初始状态 等待中 那么不进行操作
    this.status = FULFILLED // 状态更改为成功
    this.$value = value // 保存成功后的值
    while(this.successCallback.length) this.successCallback.shift()(value) // 如果成功回调存在 那么就进行调用
  }
  reject = reason => { 
    if(this.status !== PENDING) {return} // 如果状态不是初始状态 等待中 那么不进行操作
    this.status = REJECTED // 状态更改为失败
    this.$reason = reason // 保存失败后的原因
    while(this.failCallback.length) this.failCallback.shift()(reason) // 如果失败回调存在 那么就进行调用
  }

  then(successCallback, failCallback) { 
    if (this.status === FULFILLED) {
      successCallback(this.$value)
    } else if (this.status === REJECTED) {
      failCallback(this.$reason)
    } else { 
      // 等待
      // 将成功回调和失败回调存起来
      this.successCallback.push(uccessCallback)
      this.failCallback.push(successCallback)
    }
  }
}

module.exports = MyPromise